export default function throttle(
    fn,
    interval = 1000,
    options = {
        leading: true,
        trailing: false
    }
) {
    // 1.记录上一次的开始时间
    const { leading, trailing, resultCallback } = options;
    let lastTime = 0;
    let timer = null; // 2.事件触发时, 真正执行的函数

    const _throttle = function (...args) {
        return new Promise((resolve, reject) => {
            // 2.1.获取当前事件触发时的时间
            const nowTime = new Date().getTime();
            if (!lastTime && !leading) lastTime = nowTime; // 2.2.使用当前触发的时间和之前的时间间隔以及上一次开始的时间, 计算出还剩余多长事件需要去触发函数

            const remainTime = interval - (nowTime - lastTime);

            if (remainTime <= 0) {
                if (timer) {
                    clearTimeout(timer);
                    timer = null;
                } // 2.3.真正触发函数

                const result = fn.apply(this, args);
                if (resultCallback) resultCallback(result);
                resolve(result); // 2.4.保留上次触发的时间

                lastTime = nowTime;
                return;
            }

            if (trailing && !timer) {
                timer = setTimeout(() => {
                    timer = null;
                    lastTime = !leading ? 0 : new Date().getTime();
                    const result = fn.apply(this, args);
                    if (resultCallback) resultCallback(result);
                    resolve(result);
                }, remainTime);
            }
        });
    };

    _throttle.cancel = function () {
        if (timer) clearTimeout(timer);
        timer = null;
        lastTime = 0;
    };

    return _throttle;
}
